package ifrn.agendaweb.jpa;

import ifrn.agendaweb.modelo.Compromisso;
import ifrn.agendaweb.modelo.Contato;
import ifrn.agendaweb.modelo.Usuario;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.transaction.annotation.Transactional;


@Transactional
public class ContatoJPA {

	private EntityManager em;

	@PersistenceContext
	public void setEm(EntityManager em) {
		this.em = em;
	}

	
	public void criarContato(Contato modelo) {
		em.persist(modelo);
	}

	
	public Contato recuperarPorId(Contato modelo) throws PersistenciaException {
		try {
			return em.find(Contato.class, modelo.getId());
		} catch (EntityNotFoundException notFound) {
			throw new PersistenciaException("Entidade buscada não é foi encontrada.");
		} catch (NonUniqueResultException nonUnique) {
			throw new PersistenciaException("A busca retornou mais de um resultado.");
		}
		
	}
	
	//lista contato por email	
	@SuppressWarnings("unchecked")
	public List<Contato> recuperarPorEmail(Contato contato) {		
		Query query = em.createQuery("FROM Contato contato WHERE contato.email = '"+ contato.getEmail() +"'");
		return query.getResultList();
	}
	
	
	//lista contato por nome	
		@SuppressWarnings("unchecked")
		public List<Contato> recuperarPorNome(Contato contato) {		
			Query query = em.createQuery("FROM Contato contato WHERE contato.nome = '"+ contato.getNome() +"'");
			return query.getResultList();
		}

	//Lista todos os contatos
/*	@SuppressWarnings("unchecked")
	public List<Contato> lista() {
		Query query = em.createQuery("from Contato ORDER BY nome ASC");
		List<Contato> contatos = query.getResultList();
		return contatos;
	}
	*/
	@SuppressWarnings("unchecked")
	public List<Contato> lista(Usuario usuario) {		
		Query query = em.createQuery("FROM Contato c "
				+ "WHERE c.usuario.id = :id ORDER BY nome ASC");
		query.setParameter("id", usuario.getId());
		return query.getResultList();
	}
	
	//busca de contato por nome
	@SuppressWarnings("unchecked")
	public List<Contato> listarPorNome(String nome, Usuario usuario) {	
		Query query = em.createQuery("FROM Contato c WHERE c.usuario.id = :id and nome like '"+nome+"%'ORDER BY nome ASC");
		query.setParameter("id", usuario.getId());
		return query.getResultList();
	}
	
	

	//Atualiza��o de contato
	public void atualizarContato(Contato modelo){			
			em.merge(modelo);
	}
	
	
	//ver exclu~sao!!!!!!
	
	//exclus�o de contato
	public void deletarContato(Contato modelo) throws PersistenciaException {
		try {
			modelo = this.recuperarPorId(modelo);
			em.remove(modelo);
		} catch (PersistenciaException pex ) {
			throw pex;
		}
	}

	
	
/*	
	@SuppressWarnings("unchecked")
	public List<Contato> verSeEmailExiste(Contato contato) {		
		Query query = em.createQuery("FROM Contato WHERE Email = '"+ contato.getEmail() +"'");
				
		return query.getResultList();		
	}
	
	
	@SuppressWarnings("unchecked")
	public List<Contato> verSeNomeExiste(Contato contato) {		
		Query query = em.createQuery("FROM Contato contato WHERE contato.nome = '"+ contato.getNome() +"'");
		return query.getResultList();
	}
	
	*/	
	
	
	
	
	
}